home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifgate / ifunpack.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-23  |  4.7 KB  |  227 lines

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/stat.h>
  7. #if defined(HAS_STATFS)
  8. #if defined(STATFS_IN_VFS_H)
  9. #include <sys/vfs.h>
  10. #elif defined(STATFS_IN_STATFS_H)
  11. #include <sys/statfs.h>
  12. #elif defined(STATFS_IN_STATVFS_H)
  13. #include <sys/statvfs.h>
  14. #elif defined(STATFS_IN_MOUNT_H)
  15. #include <sys/mount.h>
  16. #else
  17. #error No include for statfs() call defined
  18. #endif
  19. #elif defined(HAS_STATVFS)
  20. #include <sys/statvfs.h>
  21. #endif
  22. #include <dirent.h>
  23. #ifdef HAS_SYSLOG
  24. #include <syslog.h>
  25. #endif
  26. #include "getopt.h"
  27. #include "xutil.h"
  28. #include "lutil.h"
  29. #include "config.h"
  30. #include "version.h"
  31.  
  32. #define UNPACK_FACTOR 300
  33. #define TOSS_FACTOR 120
  34. #define NEWSSPOOL "/usr/spool/news"
  35.  
  36. extern char* logname;
  37.  
  38. static int unpack(char *);
  39. static int toss(char *);
  40. #if defined(HAS_STATFS) || defined(HAS_STATVFS)
  41. static int checkspace(char *,char *,int);
  42. static char *newsspool=NEWSSPOOL;
  43. #endif
  44. extern int f_lock(char *);
  45. extern void funlock(int);
  46. extern int execute(char *,char *,char *,char *,char *,char *);
  47. extern char *unpacker(char *);
  48.  
  49. void usage(void)
  50. {
  51.     confusage("");
  52. }
  53.  
  54. int main(argc,argv)
  55. int argc;
  56. char *argv[];
  57. {
  58.     int c;
  59.     int rc=0,maxrc=0;
  60.     int files=0,files_ok=0,packets=0,packets_ok=0;
  61.     DIR *dp;
  62.     struct dirent *de;
  63.  
  64. #ifdef MAILLOG
  65.         logfacility=MAILLOG;
  66. #endif
  67.  
  68.     setmyname(argv[0]);
  69.     while ((c=getopt(argc,argv,"hx:I:")) != -1)
  70.     if (confopt(c,optarg)) switch (c)
  71.     {
  72.         default:    usage(); exit(1);
  73.     }
  74.  
  75.     if (readconfig())
  76.     {
  77.         fprintf(stderr,"Error getting configuration, aborting\n");
  78.         exit(1);
  79.     }
  80.  
  81.     if (chdir(protinbound) == -1)
  82.     {
  83.         logerr("$Error changing to directory %s",protinbound);
  84.         exit(1);
  85.     }
  86.  
  87.     if ((dp=opendir(protinbound)) == NULL)
  88.     {
  89.         logerr("$Error opening directory %s",protinbound);
  90.         exit(1);
  91.     }
  92.  
  93.     umask(066);
  94.  
  95.     while((de=readdir(dp)))
  96.     if ((strlen(de->d_name) == 12) &&
  97.         ((strncasecmp(de->d_name+8,".su",3) == 0) ||
  98.          (strncasecmp(de->d_name+8,".mo",3) == 0) ||
  99.          (strncasecmp(de->d_name+8,".tu",3) == 0) ||
  100.          (strncasecmp(de->d_name+8,".we",3) == 0) ||
  101.          (strncasecmp(de->d_name+8,".th",3) == 0) ||
  102.          (strncasecmp(de->d_name+8,".fr",3) == 0) ||
  103.          (strncasecmp(de->d_name+8,".sa",3) == 0)))
  104.     {
  105.         files++;
  106. #if defined(HAS_STATFS) | defined(HAS_STATVFS)
  107.         if (checkspace(protinbound,de->d_name,UNPACK_FACTOR))
  108. #endif
  109.             if ((rc=unpack(de->d_name)) == 0) files_ok++;
  110.             else logerr("Error unpacking file %s",de->d_name);
  111. #if defined(HAS_STATFS) | defined(HAS_STATVFS)
  112.         else loginf("Insufficient space to unpack file %s",de->d_name);
  113. #endif
  114.         if (rc > maxrc) maxrc=rc;
  115.     }
  116.  
  117.     rewinddir(dp);
  118.  
  119.     while((de=readdir(dp)))
  120.     if ((strlen(de->d_name) == 12) &&
  121.         (strncasecmp(de->d_name+8,".pkt",4) == 0))
  122.     {
  123.         packets++;
  124. #if defined(HAS_STATFS) | defined(HAS_STATVFS)
  125.         if (checkspace(newsspool,de->d_name,TOSS_FACTOR))
  126. #endif
  127.             if ((rc=toss(de->d_name)) == 0) packets_ok++;
  128.             else logerr("Error tossing packet %s",de->d_name);
  129. #if defined(HAS_STATFS) | defined(HAS_STATVFS)
  130.         else loginf("Insufficient space to toss packet %s",de->d_name);
  131. #endif
  132.         if (rc > maxrc) maxrc=rc;
  133.     }
  134.  
  135.     closedir(dp);
  136.  
  137.     if (files || packets)
  138.         loginf("processed %d of %d files, %d of %d packets, rc=%d",
  139.             files_ok,files,packets_ok,packets,maxrc);
  140.  
  141.     return maxrc;
  142. }
  143.  
  144. int unpack(fn)
  145. char *fn;
  146. {
  147.     char *cmd;
  148.     int rc,ld;
  149.  
  150.     if ((cmd=unpacker(fn)) == NULL) return 1;
  151.     if ((ld=f_lock(fn)) == -1) return 1;
  152.     rc=execute(cmd,fn,(char *)NULL,"/dev/null",logname,logname);
  153.     if (rc == 0) unlink(fn);
  154.     funlock(ld);
  155.     return rc;
  156. }
  157.  
  158. int toss(fn)
  159. char *fn;
  160. {
  161.     int rc,ld;
  162.     char newname[16];
  163.     char *cmd,tmpb[32],*p;
  164.     int i;
  165.  
  166.     if ((ld=f_lock(fn)) == -1) return 1;
  167.     p=tmpb;
  168.     *p='\0';
  169.     for (i=0;i<26;i++)
  170.         if (verbose & (1<<i))
  171.             *p++='a'+i;
  172.     cmd=xstrcpy(iftoss);
  173.     if (tmpb[0])
  174.     {
  175.         cmd=xstrcat(cmd," -x ");
  176.         cmd=xstrcat(cmd,tmpb);
  177.     }
  178.     cmd=xstrcat(cmd," -I ");
  179.     cmd=xstrcat(cmd,configname);
  180.     rc=execute(cmd,(char *)NULL,(char *)NULL,fn,logname,logname);
  181.     free(cmd);
  182.     if (rc == 0) unlink(fn);
  183.     else
  184.     {
  185.         strncpy(newname,fn,sizeof(newname)-1);
  186.         strcpy(newname+8,".bad");
  187.         rename(fn,newname);
  188.     }
  189.     funlock(ld);
  190.     return rc;
  191. }
  192.  
  193. #if defined(HAS_STATFS) | defined(HAS_STATVFS)
  194. int checkspace(dir,fn,factor)
  195. char *dir,*fn;
  196. int factor;
  197. {
  198.     struct stat st;
  199.  
  200. #ifdef HAS_STATVFS
  201.     struct statvfs sfs;
  202.  
  203.     if ((stat(fn,&st) != 0) || (statvfs(dir,&sfs) != 0))
  204. #else
  205.     struct statfs sfs;
  206.  
  207. #ifdef SCO_STYLE_STATFS
  208.     if ((stat(fn,&st) != 0) || (statfs(dir,&sfs,sizeof(sfs),0) != 0))
  209. #else
  210.     if ((stat(fn,&st) != 0) || (statfs(dir,&sfs) != 0))
  211. #endif
  212. #endif
  213.     {
  214.         logerr("$cannot stat \"%s\" or statfs \"%s\", assume enough space",
  215.             fn,dir);
  216.         return 1;
  217.     }
  218.     if ((((st.st_size/sfs.f_bsize+1)*factor)/100L) > sfs.f_bfree)
  219.     {
  220.         loginf("Only %lu %lu-byte blocks left on device where %s is located",
  221.             sfs.f_bfree,sfs.f_bsize,dir);
  222.         return 0;
  223.     }
  224.     return 1;
  225. }
  226. #endif
  227.